雜湊表(Hash table,也叫哈希表),是根據鍵(Key)而直接查詢在內存存儲位置的資料結構。 - 維基百科
Hash
在 Ruby 有兩種寫法,新式寫法寫起來就像 JSON
,鍵與值之間用冒號 :
分割,但兩種寫法本質上是一樣的:
old_hash = { :name => "Karen", :age => 18 } # 舊寫法
new_hash = { name: "Karen", age: 18 } # 新寫法
# 印出 {:name => "Karen", :age => 18}
其實它就是 key - value pairs
的集合,拿對鑰匙就能拿對值:
profile = { :name => "Karen", :age => 18 }
profile.keys # 印出 [:name, :age]
profile.values # 印出 ["Karen", 18]
之前我們對字串或是陣列取值時,我們可以照 index
取:
"我是不是很可愛"[1] # 印出 " 是 "
[1, 2, 3, 4, 5][0] # 印出 1
但 hash
是無序的元素集合,你可以想成它是用 key
來當索引的:
profile = { :name => "Karen", :age => 18 }
profile[1] # 印出 nil
profile[:name] # 印出 "Karen"
雖然 class
還沒分享過,以下先假設一個自我介紹的情境,必須 依序
帶入參數 name
跟 age
好讓句子完整呈現:
class Introduction
def initialize(name, age)
@name = name
@age = age
end
def say
puts " 我的名字是 #{@name},今年 #{@age} 歲。"
end
end
Karen = Introduction.new("Karen", 18)
Karen.say
# 印出 我的名字是 Karen,今年 18 歲,
可是自介這麼短有點缺乏誠意,如果用上面的方式寫,要依照順序去填空,當資訊量變多時,也難保順序不會出錯,若是填錯就文不對題了,這時 hash
無序的特性就凸顯出來:
class Introduction
def initialize(profile)
@name = profile[:name]
@age = profile[:age]
@email = profile[:email]
@city = profile[:city]
@language = profile[:language]
end
def say
puts "我的名字是 #{@name},今年 #{@age} 歲,可以用 #{@email} 聯絡我,標準#{@city}人,正在學習 #{@language},請多指教! "
end
end
Karen = Introduction.new(name: "Karen", age: 18, email: "cute@cjhan.tw", city: "天龍", language: "Ruby")
Karen.say
# 印出以下內容
# 我的名字是 Karen,今年 18 歲,可以用 cute@cjhan.tw 聯絡我,標準天龍人,正在學習 Ruby,請多指教!
就算帶入的參數順序調換,也不會影響我們要的結果:
# 承上
Karen = Introduction.new( city: "天龍", age: 18, email: "cute@cjhan.tw", name: "Karen", language: "Ruby" )
Karen.say
# 印出以下內容
# 我的名字是 Karen,今年 18 歲,可以用 cute@cjhan.tw 聯絡我,標準天龍人,正在學習 Ruby,請多指教!
那...我們的主題 hash
呢?在 Ruby 中,最後一個 {}
是可以省略的:
Karen = Introduction.new({name: "Karen", age: 18, email: "cute@cjhan.tw", city: "天龍", language: "Ruby"})
如同之前所分享的,這裡還可以省略小括號,得到的結果也不會改變:
Karen = Introduction.new name: "Karen", age: 18, email: "cute@cjhan.tw", city: "天龍", language: "Ruby"
以下是 Rails
裡常出現的程式碼,猜猜這裡面有幾個參數?
link_to "⾸頁", root_path, class:"btn btn-default", method: "post", confirm: true
答案明天分享~
參考資料:
為你自己學 Ruby on Rails
此文同步刊登於CJ-Han的網站